iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
1
自我挑戰組

從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!系列 第 15

Day15 | attr_reader . attr_writer . attr_accessor

  • 分享至 

  • xImage
  •  

昨天文章在取用實體變數的時候,提到Ruby內建的三個方法attr_readerattr_writer以及attr_accessor,那這三個方法分別是做什麼的呢?列出來大概是這樣。

  • attr_reader:getter 取出實體變數
  • attr_writer:setter 指派實體變數
  • attr_accessor:getter + setter 可取出也可指派,簡單說就是可讀可寫啦!

什麼是Getter與Setter?先從程式碼來看,當我們定義namename=的方法時,其實就是在寫Getter與Setter的方法。


class Girl
  def initialize(name)
    @name = name
  end

  def name    # 給name定義getter方法
    p @name
  end

  def name=(new_name)    # 給name定義setter方法
    p @name = new_name
  end
end

sophia = Girl.new('Sophia')
sophia.name    # 呼叫getter方法,回傳 "Sophia"
sophia.name = 'Dora'    # 呼叫setter方法,回傳 "Dora"

那為什麼不這樣寫就好了?(菜鳥式疑問
只能說這樣得寫法實在太過於囉唆,所以Ruby創建attr_readerattr_writer以及attr_accessor,就是讓我寫起來更利落方便。
這三個方法可以快速的在Ruby的類別裡產生一對getter以及setter方法,從例子來看attr_reader、attr_writer以及attr_accessor,我們利用instance_methods(false)來查看結果:

class Girl
  attr_reader :name,:age
  def initialize(name, age)
    @name = name
    @age = age
  end
end

girl = Girl.new("Sophia", 3)

attr_reader

從attr_reader身上我們會得到:nameage方法

class Girl
  attr_reader :name
  … (略)
end

p Girl.instance_methods(false)	# => [:name]

attr_writer

從attr_writer身上我們會得到name=的方法,

class Girl
  attr_writer :name
  … (略)
end

p Girl.instance_methods(false)	# => [:name=]

attr_accessor

從attr_accessor身上則是得到:namename=兩個Getter與Setter的方法都擁有。

class Girl
  attr_accessor :name,:age
  … (略)
end

p Girl.instance_methods(false)	# => [:name,:name=]

以上,能讓你更快速產生getter以及setter方法,請依照個人需求選用喔~

參考連結:
How getter/setter methods work in Ruby
Ruby 語法放大鏡之「attr_accessor 是幹嘛的?」


上一篇
Day14 | 實體變數(instance Variable)
下一篇
Day16 |   認識 * 與 **
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言